package main

import (
	"errors"
	"fmt"
	"os"
)

func main() {
	//test1()
	//test2()
	//test3()
	//test4()
	test5()
}

// Fprint Fprint系列函数会将内容输出到一个io.Writer接口类型的变量w中，我们通常用这个函数往文件中写入内容。
func test1() {
	fmt.Fprint(os.Stdout, "向标准输出写入内容")
	file, err := os.OpenFile("./xx.txt", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
	if err != nil {
		fmt.Println("打开文件失败，err:", err)
		return
	}
	name := "jar壳虫"
	fmt.Fprintf(file, "向文件写入内容：%s", name)
}

// Sprint Sprint系列函数会把传入的数据生成并返回一个字符串。
func test2() {
	s1 := fmt.Sprint("沙河小王子")
	name := "沙河小王子"
	age := 18
	s2 := fmt.Sprintf("name:%s,age:%d", name, age)
	s3 := fmt.Sprintln("沙河小王子")
	fmt.Println(s1, s2, s3)
}

// Printf

//占位符	说明
//%v	值的默认格式表示
//%+v	类似%v，但输出结构体时会添加字段名
//%#v	值的Go语法表示
//%T	打印值的类型
//%%	百分号

func test3() {
	fmt.Printf("%v\n", 100)
	fmt.Printf("%v\n", false)
	o := struct{ name string }{"小王子"}
	fmt.Printf("%v\n", o)
	fmt.Printf("%#v\n", o)
	fmt.Printf("%+v\n", o)
	fmt.Printf("%T\n", o)
	fmt.Printf("100%%\n")
	fmt.Printf("%t\n", false)
}

// Errorf Errorf函数根据format参数生成格式化字符串并返回一个包含该字符串的错误。
func test4() {
	e := errors.New("原始错误e")
	e = fmt.Errorf("Wrap了一个错误%w", e)
	fmt.Println(e)
}

func test5() {
	s := "<小王子>"
	arr := []byte{1, 2, 3, 4}
	fmt.Printf("%s\n", s)
	fmt.Printf("%q\n", s)
	fmt.Printf("%x\n", s)
	fmt.Printf("%X\n", s)
	fmt.Printf("%s\n", arr)
	fmt.Printf("%q\n", arr)
	fmt.Printf("%x\n", arr)
	fmt.Printf("%X\n", arr)
}

// test6
//
//	@Description:
//
// 1. %v    只输出所有的值
// 2. %+v 先输出字段名字，再输出该字段的值
// 3. %#v 先输出结构体名字值，再输出结构体（字段名字+字段的值）
func test6() {
	t := &Teacher{name: "zhangsan", age: 123}
	fmt.Printf("%v \n", t)
	fmt.Printf("%+v \n", t)
	fmt.Printf("%#v \n", t)

}

type Teacher struct {
	name string
	age  int
}

func init() {
	fmt.Println("init \n")
}
